#include "user_tim.h"

TIMING* timing[TIMING_NUM_MAX];//定时器缓存区
uint8_t timer_task_num = 0; //定时器缓存区内定时任务量

/*************************************************
  Function:       User_Timer_AddTask
  Description:    向定时器缓存区中添加定时任务
  Input:          timer：定时任务
  Return:         无
  other：         
*************************************************/
void User_Timer_AddTask(TIMING* timer)
{
	timing[timer_task_num] = timer;
	timer_task_num++;
}

/*************************************************
  Function:       User_Timer_DeleteTask
  Description:    向定时器缓存区中删除定时任务
  Input:          timer：定时任务
  Return:         无
  other：         定时任务删除后，定时任务后的任务左移填充该位置
*************************************************/
void User_Timer_DeleteTask(TIMING* timer)
{
	uint8_t i;
	bool isfind = false;
	for(i=0;i<timer_task_num;i++)
	{
		if(timing[i] == timer)
		{
			isfind = true;
		}
		if(isfind == true)
		{
			timing[i] = timing[i+1];
		}
	}
	timer_task_num--;
}


/*************************************************
  Function:       User_TIM0_Init
  Description:    定时器0初始化函数
  Input:          无
  Return:         无
  other:          20ms定时器
*************************************************/
void User_TIM0_Init(void)//20ms定时器
{
	FL_GPTIM_InitTypeDef        timInit = {0};
	
	timInit.prescaler             = 20 - 1;                     // 分频系数20
	timInit.counterMode           = FL_GPTIM_COUNTER_DIR_UP;   // 向上计数
	timInit.autoReload            = 8000 - 1;                          // 自动重装载值8000
	timInit.clockDivision         = FL_GPTIM_CLK_DIVISION_DIV1;  // 死区和滤波分频
	timInit.autoReloadState       = FL_DISABLE;                       // 预装载preload使能                        
	FL_GPTIM_Init(GPTIM0, &timInit);
	 FL_GPTIM_ClearFlag_Update(GPTIM0);

    /* 中断使能 */
    FL_GPTIM_EnableIT_Update(GPTIM0);   

    /* 使能并配置NVIC */
    NVIC_DisableIRQ(GPTIM01_IRQn);
    NVIC_SetPriority(GPTIM01_IRQn,2);//设置中断优先级
    NVIC_EnableIRQ(GPTIM01_IRQn);
	
	FL_GPTIM_Enable(GPTIM0);    // 使能定时器
}

/*************************************************
  Function:       Time_Handle_1sStart
  Description:    启动定时任务，更改以秒为单位的设定值，使能标志位置位
  Input:          num：模拟定时器编号
				  time:定时时间（秒）
  Return:         无
  other:          
*************************************************/
void Time_Handle_1sStart(TIMING* timer,uint32_t time)
{
	if(time != 0)
    {
        timer->work_time = time*50-1;
    }
    else
    {
        timer->work_time = 1;
    }
	timer->work_en = true;
}

/*************************************************
  Function:       Time_Handle_100msStart
  Description:    启动定时任务，更改以100毫秒为单位的设定值，使能标志位置位
  Input:          num：模拟定时器编号
				  time:定时时间（100毫秒）
  Return:         无
  other:          
*************************************************/
void Time_Handle_100msStart(TIMING* timer,uint32_t time)
{
	if(time != 0)
    {
        timer->work_time = time*5-1;
    }
    else
    {
        timer->work_time = 1;
    }
	timer->work_en = true;
}

/*************************************************
  Function:       Time_Handle_20msStart
  Description:    启动定时任务，更改以20毫秒为单位的设定值，使能标志位置位
  Input:          num：模拟定时器编号
				  time:定时时间（20毫秒）
  Return:         无
  other:          
*************************************************/
void Time_Handle_20msStart(TIMING* timer,uint32_t time)
{
	if(time != 0)
    {
        timer->work_time = time-1;
    }
    else
    {
        timer->work_time = 1;
    }
	timer->work_en = true;
}

/*************************************************
  Function:       Time_Handle_Stop
  Description:    停止定时
  Input:          timer：定时器任务
  Return:         无
  other:          
*************************************************/
void Time_Handle_Stop(TIMING* timer)
{
	timer->work_en = false;
	timer->work_time = 0;
}

/*************************************************
  Function:       User_TIM_init
  Description:    定时器初始化
  Input:          无
  Return:         无
  other:          使能所有定时器
*************************************************/
void User_TIM_init(void)
{
	User_TIM0_Init();
}
